home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Headers / mach / i386 / simple_lock.h < prev    next >
Text File  |  1995-02-14  |  1KB  |  81 lines

  1. /*
  2.  * Copyright (c) 1992 NeXT Computer, Inc.
  3.  *
  4.  * Simple spin locks.
  5.  *
  6.  * HISTORY
  7.  *
  8.  * 19 November 1992 David E. Bohman at NeXT
  9.  *    Created.
  10.  */
  11.  
  12. #import <mach/boolean.h>
  13.  
  14. #ifndef    _MACH_I386_SIMPLE_LOCK_H_
  15. #define _MACH_I386_SIMPLE_LOCK_H_
  16.  
  17. struct slock {
  18.     boolean_t        locked;
  19. };
  20.  
  21. typedef struct slock    simple_lock_data_t;
  22. typedef struct slock    *simple_lock_t;
  23.  
  24. extern simple_lock_t    simple_lock_alloc(void);
  25. extern void        simple_lock_free(simple_lock_t);
  26.  
  27. static __inline__
  28. void
  29. simple_lock_init(
  30.     simple_lock_t    slock
  31. )
  32. {
  33.     slock->locked = FALSE;
  34. }
  35.  
  36. static __inline__
  37. boolean_t
  38. simple_lock_try(
  39.     simple_lock_t    slock
  40. )
  41. {
  42.     boolean_t        result;
  43.     
  44.     asm volatile(
  45.         "xchgl %1,%0; xorl %3,%0"
  46.         : "=r" (result), "=m" (slock->locked)
  47.         : "0" (TRUE), "i" (TRUE));
  48.         
  49.     return (result);
  50. }
  51.  
  52. static __inline__
  53. void
  54. simple_lock(
  55.     simple_lock_t    slock
  56. )
  57. {    
  58.     do
  59.         {
  60.         while (slock->locked)
  61.         continue;
  62.     }
  63.     while (!simple_lock_try(slock));
  64. }
  65.  
  66. static __inline__
  67. void
  68. simple_unlock(
  69.     simple_lock_t    slock
  70. )
  71. {
  72.     boolean_t        result;
  73.     
  74.     asm volatile(
  75.     "xchgl %1,%0"
  76.         : "=r" (result), "=m" (slock->locked)
  77.         : "0" (FALSE));
  78. }
  79.  
  80. #endif    _MACH_I386_SIMPLE_LOCK_H_
  81.